google.pacman || function () {
    var a = true,
        e = false,
        g = {}, i = [1, 4, 2, 8],
        l = {
            0: {
                axis: 0,
                increment: 0
            },
            1: {
                axis: 0,
                increment: -1
            },
            2: {
                axis: 0,
                increment: +1
            },
            4: {
                axis: 1,
                increment: -1
            },
            8: {
                axis: 1,
                increment: +1
            }
        }, m = [0, 7, 17, 32],
        n = [{
            x: 5,
            y: 1,
            w: 60
        }, {
            x: 5,
            y: 4,
            w: 5
        }, {
            x: 5,
            y: 1,
            h: 4
        }, {
            x: 9,
            y: 1,
            h: 12
        }, {
            x: 5,
            y: 12,
            h: 4
        }, {
            x: 10,
            y: 12,
            h: 4
        }, {
            x: 5,
            y: 15,
            w: 16
        }, {
            x: 5,
            y: 12,
            w: 31
        }, {
            x: 64,
            y: 1,
            h: 4
        }, {
            x: 60,
            y: 4,
            w: 5
        }, {
            x: 60,
            y: 1,
            h: 12
        }, {
            x: 52,
            y: 1,
            h: 12
        }, {
            x: 48,
            y: 9,
            w: 5
        }, {
            x: 19,
            y: 1,
            h: 12
        }, {
            x: 19,
            y: 4,
            w: 26
        }, {
            x: 19,
            y: 7,
            w: 5
        }, {
            x: 13,
            y: 7,
            h: 6
        }, {
            x: 13,
            y: 7,
            w: 3
        }, {
            x: 15,
            y: 7,
            h: 6
        }, {
            x: 56,
            y: 1,
            h: 12
        }, {
            x: 44,
            y: 4,
            w: 9
        }, {
            x: 64,
            y: 12,
            h: 4
        }, {
            x: 44,
            y: 15,
            w: 21
        }, {
            x: 54,
            y: 12,
            h: 4
        }, {
            x: 44,
            y: 12,
            w: 21
        }, {
            x: 44,
            y: 1,
            h: 15
        }, {
            x: 41,
            y: 13,
            w: 4
        }, {
            x: 41,
            y: 13,
            h: 3
        }, {
            x: 38,
            y: 13,
            h: 3
        }, {
            x: 38,
            y: 15,
            w: 4
        }, {
            x: 35,
            y: 10,
            w: 10
        }, {
            x: 35,
            y: 1,
            h: 15
        }, {
            x: 35,
            y: 13,
            w: 4
        }, {
            x: 21,
            y: 12,
            h: 4
        }, {
            x: 24,
            y: 12,
            h: 4
        }, {
            x: 24,
            y: 15,
            w: 12
        }, {
            x: 27,
            y: 4,
            h: 9
        }, {
            x: 31,
            y: 7,
            h: 6
        }, {
            x: 31,
            y: 7,
            w: 5
        }, {
            x: 60,
            y: 8,
            w: 10,
            type: 1
        }, {
            x: 1,
            y: 8,
            w: 9,
            type: 1
        }],
        o = [{ //特殊路径
            x: 1,
            y: 8,
            w: 8
        }, {
            x: 61,
            y: 8,
            w: 9
        }, {
            x: 44,
            y: 5,
            h: 7
        }, {
            x: 35,
            y: 5,
            h: 7
        }, {
            x: 36,
            y: 4,
            w: 8
        }, {
            x: 36,
            y: 10,
            w: 8
        }, {
            x: 39,
            y: 15,
            w: 2
        }],
        p = [{ //能量块的坐标
            x: 5,
            y: 15
        }, {
            x: 5,
            y: 3
        }, {
            x: 14,
            y: 7
        }, {
            x:48,
            y: 9
        }, {
            x: 64,
            y: 3
        }, {
            x: 64,
            y: 15
        }],
        q = [{ //穿越路径
            x: 2,
            y: 8
        }, {
            x: 67,
            y: 8
        }],
        r = { // actor 初始位置
            1: [{
                //x: 39.5,
				x: 39.5,
                y: 15,
                dir: 4
            }, {
                //x: 39.5,
				x: 39.5,
                y: 4,
                dir: 4,
                scatterX: 57,
                scatterY: -4
            }, {
                //x: 39.5,
				x: 39.5,
                y: 7,
                dir: 2,
                scatterX: 0,
                scatterY: -4
            }, {
                //x: 37.625,
				x: 37.625,
                y: 7,
                dir: 1,
                scatterX: 57,
                scatterY: 20
            }, {
                //x: 41.375,
				x: 41.375,
                y: 7,
                dir: 1,
                scatterX: 0,
                scatterY: 20
            }],
            2: [{
                x: 40.25,
                y: 15,
                dir: 8
            }, {
                x: 38.75,
                y: 15,
                dir: 4
            }, {
                x: 39.5,
                y: 4,
                dir: 4,
                scatterX: 57,
                scatterY: -4
            }, {
                x: 39.5,
                y: 7,
                dir: 2,
                scatterX: 0,
                scatterY: -4
            }, {
                x: 37.625,
                y: 7,
                dir: 1,
                scatterX: 57,
                scatterY: 20
            }, {
                x: 41.375,
                y: 7,
                dir: 1,
                scatterX: 0,
                scatterY: 20
            }]
        }, s = [32, 312],
        v = [80, 312],
        w = { // tick timer 
            0: 0.16,
            1: 0.23,
            2: 1,
            3: 1,
            4: 2.23,
            5: 0.3,
            6: 1.9,
            7: 2.23,
            8: 1.9,
            9: 5,
            10: 1.9,
            11: 1.18,
            12: 0.3,
            13: 0.5,
            14: 1.9,
            15: 9,
            16: 10,
            17: 0.26
        }, y = 0.8 * 0.4,
        z = [{}, {
            ghostSpeed: 0.75,
            ghostTunnelSpeed: 0.4,
            playerSpeed: 0.8,
            dotEatingSpeed: 0.71,
            ghostFrightSpeed: 0.5,
            playerFrightSpeed: 0.9,
            dotEatingFrightSpeed: 0.79,
            elroyDotsLeftPart1: 20,
            elroySpeedPart1: 0.8,
            elroyDotsLeftPart2: 10,
            elroySpeedPart2: 0.85,
            frightTime: 6,
            frightBlinkCount: 5,
            fruit: 1,
            fruitScore: 100,
            ghostModeSwitchTimes: [7, 20, 7, 20, 5, 20, 5, 1],
            penForceTime: 4,
            penLeavingLimits: [0, 0, 30, 60]
        }, {
            ghostSpeed: 0.85,
            ghostTunnelSpeed: 0.45,
            playerSpeed: 0.9,
            dotEatingSpeed: 0.79,
            ghostFrightSpeed: 0.55,
            playerFrightSpeed: 0.95,
            dotEatingFrightSpeed: 0.83,
            elroyDotsLeftPart1: 30,
            elroySpeedPart1: 0.9,
            elroyDotsLeftPart2: 15,
            elroySpeedPart2: 0.95,
            frightTime: 5,
            frightBlinkCount: 5,
            fruit: 2,
            fruitScore: 300,
            ghostModeSwitchTimes: [7, 20, 7, 20, 5, 1033, 1 / 60, 1],
            penForceTime: 4,
            penLeavingLimits: [0, 0, 0, 50],
            cutsceneId: 1
        }, {
            ghostSpeed: 0.85,
            ghostTunnelSpeed: 0.45,
            playerSpeed: 0.9,
            dotEatingSpeed: 0.79,
            ghostFrightSpeed: 0.55,
            playerFrightSpeed: 0.95,
            dotEatingFrightSpeed: 0.83,
            elroyDotsLeftPart1: 40,
            elroySpeedPart1: 0.9,
            elroyDotsLeftPart2: 20,
            elroySpeedPart2: 0.95,
            frightTime: 4,
            frightBlinkCount: 5,
            fruit: 3,
            fruitScore: 500,
            ghostModeSwitchTimes: [7, 20, 7, 20, 5, 1033, 1 / 60, 1],
            penForceTime: 4,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.85,
            ghostTunnelSpeed: 0.45,
            playerSpeed: 0.9,
            dotEatingSpeed: 0.79,
            ghostFrightSpeed: 0.55,
            playerFrightSpeed: 0.95,
            dotEatingFrightSpeed: 0.83,
            elroyDotsLeftPart1: 40,
            elroySpeedPart1: 0.9,
            elroyDotsLeftPart2: 20,
            elroySpeedPart2: 0.95,
            frightTime: 3,
            frightBlinkCount: 5,
            fruit: 3,
            fruitScore: 500,
            ghostModeSwitchTimes: [7, 20, 7, 20, 5, 1033, 1 / 60, 1],
            penForceTime: 4,
            penLeavingLimits: [0,
            0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 40,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 20,
            elroySpeedPart2: 1.05,
            frightTime: 2,
            frightBlinkCount: 5,
            fruit: 4,
            fruitScore: 700,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0],
            cutsceneId: 2
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 50,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 25,
            elroySpeedPart2: 1.05,
            frightTime: 5,
            frightBlinkCount: 5,
            fruit: 4,
            fruitScore: 700,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 50,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 25,
            elroySpeedPart2: 1.05,
            frightTime: 2,
            frightBlinkCount: 5,
            fruit: 5,
            fruitScore: 1E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 50,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 25,
            elroySpeedPart2: 1.05,
            frightTime: 2,
            frightBlinkCount: 5,
            fruit: 5,
            fruitScore: 1E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 60,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 30,
            elroySpeedPart2: 1.05,
            frightTime: 1,
            frightBlinkCount: 3,
            fruit: 6,
            fruitScore: 2E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0],
            cutsceneId: 3
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 60,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 30,
            elroySpeedPart2: 1.05,
            frightTime: 5,
            frightBlinkCount: 5,
            fruit: 6,
            fruitScore: 2E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 60,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 30,
            elroySpeedPart2: 1.05,
            frightTime: 2,
            frightBlinkCount: 5,
            fruit: 7,
            fruitScore: 3E3,
            ghostModeSwitchTimes: [5,
            20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 80,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 40,
            elroySpeedPart2: 1.05,
            frightTime: 1,
            frightBlinkCount: 3,
            fruit: 7,
            fruitScore: 3E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 80,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 40,
            elroySpeedPart2: 1.05,
            frightTime: 1,
            frightBlinkCount: 3,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0],
            cutsceneId: 3
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 80,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 40,
            elroySpeedPart2: 1.05,
            frightTime: 3,
            frightBlinkCount: 5,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 100,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 50,
            elroySpeedPart2: 1.05,
            frightTime: 1,
            frightBlinkCount: 3,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 100,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 50,
            elroySpeedPart2: 1.05,
            frightTime: 1,
            frightBlinkCount: 3,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 100,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 50,
            elroySpeedPart2: 1.05,
            frightTime: 0,
            frightBlinkCount: 0,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0],
            cutsceneId: 3
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 100,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 50,
            elroySpeedPart2: 1.05,
            frightTime: 1,
            frightBlinkCount: 3,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 120,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 60,
            elroySpeedPart2: 1.05,
            frightTime: 0,
            frightBlinkCount: 0,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 1,
            dotEatingSpeed: 0.87,
            ghostFrightSpeed: 0.6,
            playerFrightSpeed: 1,
            dotEatingFrightSpeed: 0.87,
            elroyDotsLeftPart1: 120,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 60,
            elroySpeedPart2: 1.05,
            frightTime: 0,
            frightBlinkCount: 0,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }, {
            ghostSpeed: 0.95,
            ghostTunnelSpeed: 0.5,
            playerSpeed: 0.9,
            dotEatingSpeed: 0.79,
            ghostFrightSpeed: 0.75,
            playerFrightSpeed: 0.9,
            dotEatingFrightSpeed: 0.79,
            elroyDotsLeftPart1: 120,
            elroySpeedPart1: 1,
            elroyDotsLeftPart2: 60,
            elroySpeedPart2: 1.05,
            frightTime: 0,
            frightBlinkCount: 0,
            fruit: 8,
            fruitScore: 5E3,
            ghostModeSwitchTimes: [5, 20, 5, 20, 5, 1037, 1 / 60, 1],
            penForceTime: 3,
            penLeavingLimits: [0, 0, 0, 0]
        }],
        A = {
            1: [{
                x: 37.6,
                y: 7,
                dir: 1,
                dest: 6.375,
                speed: 0.48
            }, {
                x: 37.6,
                y: 6.375,
                dir: 2,
                dest: 7.625,
                speed: 0.48
            }, {
                x: 37.6,
                y: 7.625,
                dir: 1,
                dest: 7,
                speed: 0.48
            }],
            2: [{
                x: 39.5,
                y: 7,
                dir: 2,
                dest: 7.625,
                speed: 0.48
            }, {
                x: 39.5,
                y: 7.625,
                dir: 1,
                dest: 6.375,
                speed: 0.48
            }, {
                x: 39.5,
                y: 6.375,
                dir: 2,
                dest: 7,
                speed: 0.48
            }],
            3: [{
                x: 41.4,
                y: 7,
                dir: 1,
                dest: 6.375,
                speed: 0.48
            }, {
                x: 41.4,
                y: 6.375,
                dir: 2,
                dest: 7.625,
                speed: 0.48
            }, {
                x: 41.4,
                y: 7.625,
                dir: 1,
                dest: 7,
                speed: 0.48
            }],
            4: [{
                x: 37.6,
                y: 7,
                dir: 8,
                dest: 39.5,
                speed: y
            }, {
                x: 39.5,
                y: 7,
                dir: 1,
                dest: 4,
                speed: y
            }],
            5: [{
                x: 39.5,
                y: 7,
                dir: 1,
                dest: 4,
                speed: y
            }],
            6: [{
                x: 41.4,
                y: 7,
                dir: 4,
                dest: 39.5,
                speed: y
            }, {
                x: 39.5,
                y: 7,
                dir: 1,
                dest: 4,
                speed: y
            }],
            7: [{
                x: 39.5,
                y: 4,
                dir: 2,
                dest: 7,
                speed: 1.6
            }, {
                x: 39.5,
                y: 7,
                dir: 4,
                dest: 37.625,
                speed: 1.6
            }],
            8: [{
                x: 39.5,
                y: 4,
                dir: 2,
                dest: 7,
                speed: 1.6
            }],
            9: [{
                x: 39.5,
                y: 4,
                dir: 2,
                dest: 7,
                speed: 1.6
            }, {
                x: 39.5,
                y: 7,
                dir: 8,
                dest: 41.375,
                speed: 1.6
            }],
            10: [{
                x: 37.6,
                y: 7,
                dir: 8,
                dest: 39.5,
                speed: y
            }, {
                x: 39.5,
                y: 7,
                dir: 1,
                dest: 4,
                speed: y
            }],
            11: [{
                x: 39.5,
                y: 7,
                dir: 1,
                dest: 4,
                speed: y
            }],
            12: [{
                x: 41.4,
                y: 7,
                dir: 4,
                dest: 39.5,
                speed: y
            }, {
                x: 39.5,
                y: 7,
                dir: 1,
                dest: 4,
                speed: y
            }]
        }, B = {
            1: {
                actors: [{
                    ghost: e,
                    x: 64,
                    y: 9,
                    id: 0
                }, {
                    ghost: a,
                    x: 68.2,
                    y: 9,
                    id: 1
                }],
                sequence: [{
                    time: 5.5,
                    moves: [{
                        dir: 4,
                        speed: 0.75 * 0.8 * 2
                    }, {
                        dir: 4,
                        speed: 0.78 * 0.8 * 2
                    }]
                }, {
                    time: 0.1,
                    moves: [{
                        dir: 4,
                        speed: 32
                    }, {
                        dir: 4,
                        speed: 0
                    }]
                }, {
                    time: 9,
                    moves: [{
                        dir: 8,
                        speed: 0.75 * 0.8 * 2,
                        elId: "pcm-bpcm"
                    }, {
                        dir: 8,
                        speed: 0.8,
                        mode: 4
                    }]
                }]
            },
            2: {
                actors: [{
                    ghost: e,
                    x: 64,
                    y: 9,
                    id: 0
                }, {
                    ghost: a,
                    x: 70.2,
                    y: 9,
                    id: 1
                }, {
                    ghost: a,
                    x: 32,
                    y: 9.5,
                    id: 2
                }],
                sequence: [{
                    time: 2.7,
                    moves: [{
                        dir: 4,
                        speed: 0.75 * 0.8 * 2
                    }, {
                        dir: 4,
                        speed: 0.78 * 0.8 * 2
                    }, {
                        dir: 0,
                        speed: 0,
                        elId: "pcm-stck"
                    }]
                }, {
                    time: 1,
                    moves: [{
                        dir: 4,
                        speed: 0.75 * 0.8 * 2
                    }, {
                        dir: 4,
                        speed: 0.1 * 0.8
                    }, {
                        dir: 0,
                        speed: 0,
                        elId: "pcm-stck"
                    }]
                }, {
                    time: 1.3,
                    moves: [{
                        dir: 4,
                        speed: 0.75 * 0.8 * 2
                    }, {
                        dir: 4,
                        speed: 0
                    }, {
                        dir: 0,
                        speed: 0,
                        elId: "pcm-stck"
                    }]
                }, {
                    time: 1,
                    moves: [{
                        dir: 4,
                        speed: 0.75 * 0.8 * 2
                    }, {
                        dir: 4,
                        speed: 0,
                        elId: "pcm-ghfa"
                    }, {
                        dir: 0,
                        speed: 0,
                        elId: "pcm-stck"
                    }]
                }, {
                    time: 2.5,
                    moves: [{
                        dir: 4,
                        speed: 0.75 * 0.8 * 2
                    }, {
                        dir: 4,
                        speed: 0,
                        elId: "pcm-ghfa"
                    }, {
                        dir: 0,
                        speed: 0,
                        elId: "pcm-stck"
                    }]
                }]
            },
            3: {
                actors: [{
                    ghost: e,
                    x: 64,
                    y: 9,
                    id: 0
                }, {
                    ghost: a,
                    x: 70.2,
                    y: 9,
                    id: 2
                }],
                sequence: [{
                    time: 5.3,
                    moves: [{
                        dir: 4,
                        speed: 0.75 * 0.8 * 2
                    }, {
                        dir: 4,
                        speed: 0.78 * 0.8 * 2,
                        elId: "pcm-ghin"
                    }]
                }, {
                    time: 5.3,
                    moves: [{
                        dir: 4,
                        speed: 0
                    }, {
                        dir: 8,
                        speed: 0.78 * 0.8 * 2,
                        elId: "pcm-gbug"
                    }]
                }]
            }
        }, C = [90, 45, 30], //fps choice
        D = C[0];

    function E(b) {
        this.id = b
    }
    E.prototype.A = function () {
        var b = r[g.playerCount][this.id];
        this.pos = [b.y * 8, b.x * 8];
        this.posDelta = [0, 0];
        this.tilePos = [b.y * 8, b.x * 8];
        this.targetPos = [b.scatterY * 8, b.scatterX * 8];
        this.scatterPos = [b.scatterY * 8, b.scatterX * 8];
        this.lastActiveDir = this.dir = b.dir;
        this.physicalSpeed = this.requestedDir = this.nextDir = 0;
        this.c(0);
        this.reverseDirectionsNext = this.freeToLeavePen = this.modeChangedWhileInPen = this.eatenInThisFrightMode = e;
        this.l()
    };
    E.prototype.createElement = function () {
        this.el = document.createElement("div");
        this.el.className = "pcm-ac";
        this.el.id = "actor" + this.id;
        g.prepareElement(this.el, 0, 0);
        g.playfieldEl.appendChild(this.el);
        this.elPos = [0, 0];
        this.elBackgroundPos = [0, 0]
    };
    E.prototype.a = function (b) {
        var c = this.mode;
        this.mode = b;
        if (this.id == g.playerCount + 3 && (b == 16 || c == 16)) g.updateCruiseElroySpeed();
        switch (c) {
            case 32:
                g.ghostExitingPenNow = e;
                break;
            case 8:
                g.ghostEyesCount > 0 && g.ghostEyesCount--;
                g.ghostEyesCount == 0 && g.playAmbientSound();
                break
        }
        switch (b) {
            case 4:
                this.fullSpeed = g.levels.ghostFrightSpeed * 0.8;
                this.tunnelSpeed = g.levels.ghostTunnelSpeed * 0.8;
                this.followingRoutine = e;
                break;
            case 1:
                this.fullSpeed = g.levels.ghostSpeed * 0.8;
                this.tunnelSpeed = g.levels.ghostTunnelSpeed * 0.8;
                this.followingRoutine = e;
                break;
            case 2:
                this.targetPos = this.scatterPos;
                this.fullSpeed = g.levels.ghostSpeed * 0.8;
                this.tunnelSpeed = g.levels.ghostTunnelSpeed * 0.8;
                this.followingRoutine = e;
                break;
            case 8:
                this.tunnelSpeed = this.fullSpeed = 1.6;
                this.targetPos = [s[0], s[1]];
                this.freeToLeavePen = this.followingRoutine = e;
                break;
            case 16:
                this.l();
                this.followingRoutine = a;
                this.routineMoveId = -1;
                switch (this.id) {
                    case g.playerCount + 1:
                        this.routineToFollow = 2;
                        break;
                    case g.playerCount + 2:
                        this.routineToFollow = 1;
                        break;
                    case g.playerCount + 3:
                        this.routineToFollow = 3;
                        break
                }
                break;
            case 32:
                this.followingRoutine = a;
                this.routineMoveId = -1;
                switch (this.id) {
                    case g.playerCount + 1:
                        this.routineToFollow = 5;
                        break;
                    case g.playerCount + 2:
                        this.routineToFollow = 4;
                        break;
                    case g.playerCount + 3:
                        this.routineToFollow = 6;
                        break
                }
                g.ghostExitingPenNow = a;
                break;
            case 64:
                this.followingRoutine = a;
                this.routineMoveId = -1;
                switch (this.id) {
                    case g.playerCount:
                    case g.playerCount + 1:
                        this.routineToFollow = 8;
                        break;
                    case g.playerCount + 2:
                        this.routineToFollow = 7;
                        break;
                    case g.playerCount + 3:
                        this.routineToFollow = 9;
                        break
                }
                break;
            case 128:
                this.followingRoutine = a;
                this.routineMoveId = -1;
                switch (this.id) {
                    case g.playerCount:
                    case g.playerCount + 1:
                        this.routineToFollow = 11;
                        break;
                    case g.playerCount + 2:
                        this.routineToFollow = 10;
                        break;
                    case g.playerCount + 3:
                        this.routineToFollow = 12;
                        break
                }
                break
        }
        this.d()
    };
    E.prototype.l = function () {
        if (this.id >= g.playerCount) this.targetPlayerId = Math.floor(g.rand() * g.playerCount)
    };
    E.prototype.z = function (b) {
        if (!g.userDisabledSound) {
            google.pacManSound = a;
            g.updateSoundIcon()
        }
        if (this.dir == g.oppositeDirections[b]) {
            this.dir = b;
            this.posDelta = [0, 0];
            this.currentSpeed != 2 && this.c(0);
            if (this.dir != 0) this.lastActiveDir = this.dir;
            this.nextDir = 0
        } else if (this.dir != b) if (this.dir == 0) {
            if (g.playfield[this.pos[0]][this.pos[1]].allowedDir & b) this.dir = b
        } else {
            var c = g.playfield[this.tilePos[0]][this.tilePos[1]];
            if (c && c.allowedDir & b) {
                c = l[this.dir];
                var d = [this.pos[0], this.pos[1]];
                d[c.axis] -= c.increment;
                var f = 0;
                if (d[0] == this.tilePos[0] && d[1] == this.tilePos[1]) f = 1;
                else {
                    d[c.axis] -= c.increment;
                    if (d[0] == this.tilePos[0] && d[1] == this.tilePos[1]) f = 2
                }
                if (f) {
                    this.dir = b;
                    this.pos[0] = this.tilePos[0];
                    this.pos[1] = this.tilePos[1];
                    c = l[this.dir];
                    this.pos[c.axis] += c.increment * f;
                    return
                }
            }
            this.nextDir = b;
            this.posDelta = [0, 0]
        }
    };
    E.prototype.i = function (b) {
        var c = this.tilePos,
            d = l[this.dir],
            f = [c[0], c[1]];
        f[d.axis] += d.increment * 8;
        var h = g.playfield[f[0]][f[1]];
        if (b && !h.intersection) h = g.playfield[c[0]][c[1]];
        if (h.intersection) switch (this.mode) {
            case 2:
            case 1:
            case 8:
                if ((this.dir & h.allowedDir) == 0 && h.allowedDir == g.oppositeDirections[this.dir]) this.nextDir = g.oppositeDirections[this.dir];
                else {
                    b = 99999999999;
                    c = 0;
                    for (var j in i) {
                        var k = i[j];
                        if (h.allowedDir & k && this.dir != g.oppositeDirections[k]) {
                            d = l[k];
                            var x = [f[0], f[1]];
                            x[d.axis] += d.increment;
                            d = g.getDistance(x, [this.targetPos[0], this.targetPos[1]]);
                            if (d < b) {
                                b = d;
                                c = k
                            }
                        }
                    }
                    if (c) this.nextDir = c
                }
                break;
            case 4:
                if ((this.dir & h.allowedDir) == 0 && h.allowedDir == g.oppositeDirections[this.dir]) this.nextDir = g.oppositeDirections[this.dir];
                else {
                    do f = i[Math.floor(g.rand() * 4)];
                    while ((f & h.allowedDir) == 0 || f == g.oppositeDirections[this.dir]);
                    this.nextDir = f
                }
                break
        }
    };
    E.prototype.p = function (b) {
        g.tilesChanged = a;
        if (this.reverseDirectionsNext) {
            this.dir = g.oppositeDirections[this.dir];
            this.nextDir = 0;
            this.reverseDirectionsNext = e;
            this.i(a)
        }
        if (!this.ghost && !g.playfield[b[0]][b[1]].path) {
            this.pos[0] = this.lastGoodTilePos[0];
            this.pos[1] = this.lastGoodTilePos[1];
            b[0] = this.lastGoodTilePos[0];
            b[1] = this.lastGoodTilePos[1];
            this.dir = 0
        } else this.lastGoodTilePos = [b[0], b[1]];
        g.playfield[b[0]][b[1]].type == 1 && this.mode != 8 ? this.c(2) : this.c(0);
        !this.ghost && g.playfield[b[0]][b[1]].dot && g.dotEaten(this.id, b);
        this.tilePos[0] = b[0];
        this.tilePos[1] = b[1]
    };
    E.prototype.t = function () {
        var b = this.tilePos;
        switch (this.dir) {
            case 1:
                var c = [b[0], b[1]],
                    d = [b[0] + 3.6, b[1]];
                break;
            case 2:
                c = [b[0] - 4, b[1]];
                d = [b[0], b[1]];
                break;
            case 4:
                c = [b[0], b[1]];
                d = [b[0], b[1] + 3.6];
                break;
            case 8:
                c = [b[0], b[1] - 4];
                d = [b[0], b[1]];
                break
        }
        if (this.pos[0] >= c[0] && this.pos[0] <= d[0] && this.pos[1] >= c[1] && this.pos[1] <= d[1]) {
            b = l[this.nextDir];
            this.posDelta[b.axis] += b.increment
        }
    };
    E.prototype.n = function () {
        if (this.pos[0] == q[0].y * 8 && this.pos[1] == q[0].x * 8) {
            this.pos[0] = q[1].y * 8;
            this.pos[1] = (q[1].x - 1) * 8
        } else if (this.pos[0] == q[1].y * 8 && this.pos[1] == q[1].x * 8) {
            this.pos[0] = q[0].y * 8;
            this.pos[1] = (q[0].x + 1) * 8
        }
        this.mode == 8 && this.pos[0] == s[0] && this.pos[1] == s[1] && this.a(64);
        if (!this.ghost && this.pos[0] == v[0] && (this.pos[1] == v[1] || this.pos[1] == v[1] + 8)) g.eatFruit(this.id)
    };
    E.prototype.u = function () {
        this.n();
        this.ghost && this.i(e);
        var b = g.playfield[this.pos[0]][this.pos[1]];
        if (b.intersection) if (this.nextDir && this.nextDir & b.allowedDir) {
            if (this.dir != 0) this.lastActiveDir = this.dir;
            this.dir = this.nextDir;
            this.nextDir = 0;
            if (!this.ghost) {
                this.pos[0] += this.posDelta[0];
                this.pos[1] += this.posDelta[1];
                this.posDelta = [0, 0]
            }
        } else if ((this.dir & b.allowedDir) == 0) {
            if (this.dir != 0) this.lastActiveDir = this.dir;
            this.nextDir = this.dir = 0;
            this.c(0)
        }
    };
    E.prototype.o = function () {
        var b = this.pos[0] / 8,
            c = this.pos[1] / 8,
            d = [Math.round(b) * 8, Math.round(c) * 8];
        if (d[0] != this.tilePos[0] || d[1] != this.tilePos[1]) this.p(d);
        else {
            b = [Math.floor(b) * 8, Math.floor(c) * 8];
            this.pos[1] == b[1] && this.pos[0] == b[0] && this.u()
        }!this.ghost && this.nextDir && g.playfield[d[0]][d[1]].intersection && this.nextDir & g.playfield[d[0]][d[1]].allowedDir && this.t()
    };
    E.prototype.B = function () {
        if (this.id == g.playerCount && g.dotsRemaining < g.levels.elroyDotsLeftPart1 && this.mode == 2 && (!g.lostLifeOnThisLevel || g.actors[g.playerCount + 3].mode != 16)) {
            var b = g.actors[this.targetPlayerId];
            this.targetPos = [b.tilePos[0], b.tilePos[1]]
        } else if (this.ghost && this.mode == 1) {
            b = g.actors[this.targetPlayerId];
            switch (this.id) {
                case g.playerCount:
                    this.targetPos = [b.tilePos[0], b.tilePos[1]];
                    break;
                case g.playerCount + 1:
                    this.targetPos = [b.tilePos[0], b.tilePos[1]];
                    var c = l[b.dir];
                    this.targetPos[c.axis] += 32 * c.increment;
                    if (b.dir == 1) this.targetPos[1] -= 32;
                    break;
                case g.playerCount + 2:
                    var d = g.actors[g.playerCount],
                        f = [b.tilePos[0], b.tilePos[1]];
                    c = l[b.dir];
                    f[c.axis] += 16 * c.increment;
                    if (b.dir == 1) f[1] -= 16;
                    this.targetPos[0] = f[0] * 2 - d.tilePos[0];
                    this.targetPos[1] = f[1] * 2 - d.tilePos[1];
                    break;
                case g.playerCount + 3:
                    c = g.getDistance(b.tilePos, this.tilePos);
                    this.targetPos = c > 64 ? [b.tilePos[0], b.tilePos[1]] : this.scatterPos;
                    break
            }
        }
    };
    E.prototype.v = function () {
        this.routineMoveId++;
        if (this.routineMoveId == A[this.routineToFollow].length) if (this.mode == 16 && this.freeToLeavePen && !g.ghostExitingPenNow) {
            this.eatenInThisFrightMode ? this.a(128) : this.a(32);
            return
        } else if (this.mode == 32 || this.mode == 128) {
            this.pos = [s[0], s[1] + 4];
            this.dir = this.modeChangedWhileInPen ? 8 : 4;
            var b = g.mainGhostMode;
            if (this.mode == 128 && b == 4) b = g.lastMainGhostMode;
            this.a(b);
            return
        } else if (this.mode == 64) {
            if (this.id == g.playerCount || this.freeToLeavePen) this.a(128);
            else {
                this.eatenInThisFrightMode = a;
                this.a(16)
            }
            return
        } else this.routineMoveId = 0;
        b = A[this.routineToFollow][this.routineMoveId];
        this.pos[0] = b.y * 8;
        this.pos[1] = b.x * 8;
        this.dir = b.dir;
        this.physicalSpeed = 0;
        this.speedIntervals = g.getSpeedIntervals(b.speed);
        this.proceedToNextRoutineMove = e;
        this.b()
    };
    E.prototype.m = function () {
        var b = A[this.routineToFollow][this.routineMoveId];
        if (b) if (this.speedIntervals[g.intervalTime]) {
            var c = l[this.dir];
            this.pos[c.axis] += c.increment;
            switch (this.dir) {
                case 1:
                case 4:
                    if (this.pos[c.axis] < b.dest * 8) {
                        this.pos[c.axis] = b.dest * 8;
                        this.proceedToNextRoutineMove = a
                    }
                    break;
                case 2:
                case 8:
                    if (this.pos[c.axis] > b.dest * 8) {
                        this.pos[c.axis] = b.dest * 8;
                        this.proceedToNextRoutineMove = a
                    }
                    break
            }
            this.b()
        }
    };
    E.prototype.j = function () {
        if (this.routineMoveId == -1 || this.proceedToNextRoutineMove) this.v();
        this.m()
    };
    E.prototype.d = function () {
        switch (this.currentSpeed) {
            case 0:
                var b = this.id == g.playerCount && (this.mode == 2 || this.mode == 1) ? g.cruiseElroySpeed : this.fullSpeed;
                break;
            case 1:
                b = this.dotEatingSpeed;
                break;
            case 2:
                b = this.tunnelSpeed;
                break
        }
        if (this.physicalSpeed != b) {
            this.physicalSpeed = b;
            this.speedIntervals = g.getSpeedIntervals(this.physicalSpeed)
        }
    };
    E.prototype.c = function (b) {
        this.currentSpeed = b;
        this.d()
    };
    E.prototype.e = function () {
        if (this.dir) if (this.speedIntervals[g.intervalTime]) {
            var b = l[this.dir];
            this.pos[b.axis] += b.increment;
            this.o();
            this.b()
        }
    };
    E.prototype.move = function () {
        if (g.gameplayMode == 0 || this.ghost && g.gameplayMode == 1 && (this.mode == 8 || this.mode == 64)) {
            if (this.requestedDir != 0) {
                this.z(this.requestedDir);
                this.requestedDir = 0
            }
            if (this.followingRoutine) {
                this.j();
                this.mode == 64 && this.j()
            } else {
                this.e();
                this.mode == 8 && this.e()
            }
        }
    };
    E.prototype.k = function () {
        var b = g.getPlayfieldX(this.pos[1] + this.posDelta[1]),
            c = g.getPlayfieldY(this.pos[0] + this.posDelta[0]);
        if (this.elPos[0] != c || this.elPos[1] != b) {
            this.elPos[0] = c;
            this.elPos[1] = b;
            this.el.style.left = b + "px";
            this.el.style.top = c + "px"
        }
    };
    E.prototype.s = function () {
        var b = 0,
            c = 0,
            d = this.dir;
        if (d == 0) d = this.lastActiveDir;
        if (g.gameplayMode == 1 && this.id == g.playerEatingGhostId) {
            b = 3;
            c = 0
        } else if ((g.gameplayMode == 9 || g.gameplayMode == 10) && this.id == 0) {
            b = 2;
            c = 0
        } else if (g.gameplayMode == 4 || g.gameplayMode == 5 || g.gameplayMode == 7) {
            b = this.id == 0 ? 2 : 4;
            c = 0
        } else if (g.gameplayMode == 3) if (this.id == g.playerDyingId) {
            d = 20 - Math.floor(g.gameplayModeTime / g.timing[4] * 21);
            if (this.id == 0) {
                b = d - 1;
                switch (b) {
                    case -1:
                        b = 0;
                        break;
                    case 11:
                        b = 10;
                        break;
                    case 12:
                    case 13:
                    case 14:
                    case 15:
                    case 16:
                    case 17:
                    case 18:
                    case 19:
                    case 20:
                        b = 11;
                        break
                }
                c = 12
            } else switch (d) {
                case 0:
                case 1:
                case 2:
                case 6:
                case 10:
                    b = 4;
                    c = 3;
                    break;
                case 3:
                case 7:
                case 11:
                    b = 4;
                    c = 0;
                    break;
                case 4:
                case 8:
                case 12:
                case 13:
                case 14:
                case 15:
                case 16:
                case 17:
                case 18:
                case 19:
                case 20:
                    b = 4;
                    c = 2;
                    break;
                case 5:
                case 9:
                    b = 4;
                    c = 1;
                    break
            }
        } else {
            b = 3;
            c = 0
        } else if (this.el.id == "pcm-bpcm") {
            b = 14;
            c = 0;
            d = Math.floor(g.globalTime * 0.2) % 4;
            if (d == 3) d = 1;
            c += 2 * d
        } else {
            switch (d) {
                case 4:
                    c = 0;
                    break;
                case 8:
                    c = 1;
                    break;
                case 1:
                    c = 2;
                    break;
                case 2:
                    c = 3;
                    break
            }
            if (g.gameplayMode != 2) b = Math.floor(g.globalTime * 0.3) % 4;
            if (b == 3 && this.dir == 0) b = 0;
            if (b == 2 && this.id == 0) b = 0;
            if (b == 3) {
                b = 2;
                if (this.id == 0) c = 0
            }
            if (this.id == 1) b += 4
        }
        return [c, b]
    };
    E.prototype.r = function () {
        var b = 0,
            c = 0;
        if (g.gameplayMode == 10 || g.gameplayMode == 4 || g.gameplayMode == 3) {
            b = 3;
            c = 0
        } else if (g.gameplayMode == 1 && this.id == g.ghostBeingEatenId) {
            switch (g.modeScoreMultiplier) {
                case 2:
                    b = 0;
                    break;
                case 4:
                    b = 1;
                    break;
                case 8:
                    b = 2;
                    break;
                case 16:
                    b = 3;
                    break
            }
            c = 11;
            this.el.className = "pcm-ac pcm-n"
        } else if (this.mode == 4 || (this.mode == 16 || this.mode == 32) && g.mainGhostMode == 4 && !this.eatenInThisFrightMode) {
            b = 0;
            c = 8;
            if (g.frightModeTime < g.levels.frightTotalTime - g.levels.frightTime && Math.floor(g.frightModeTime / g.timing[1]) % 2 == 0) b += 2;
            b += Math.floor(g.globalTime / 16) % 2
        } else if (this.mode == 8 || this.mode == 64) {
            c = this.nextDir;
            if (!c) c = this.dir;
            switch (c) {
                case 4:
                    b = 2;
                    break;
                case 8:
                    b = 3;
                    break;
                case 1:
                    b = 0;
                    break;
                case 2:
                    b = 1;
                    break
            }
            c = 10
        } else if (this.el.id == "pcm-ghin") {
            b = 6;
            c = 8;
            b += Math.floor(g.globalTime / 16) % 2
        } else if (this.el.id == "pcm-gbug") {
            b = 6;
            c = 9;
            c += Math.floor(g.globalTime / 16) % 2
        } else if (this.el.id == "pcm-ghfa") {
            b = g.cutsceneSequenceId == 3 ? 6 : 7;
            c = 11
        } else if (this.el.id == "pcm-stck") {
            b = g.cutsceneSequenceId == 1 ? g.cutsceneTime > 60 ? 1 : g.cutsceneTime > 45 ? 2 : 3 : g.cutsceneSequenceId == 2 ? 3 : g.cutsceneSequenceId == 3 || g.cutsceneSequenceId == 4 ? 4 : 0;
            c = 13
        } else {
            c = this.nextDir;
            if (!c || g.playfield[this.tilePos[0]][this.tilePos[1]].type == 1) c = this.dir;
            switch (c) {
                case 4:
                    b = 4;
                    break;
                case 8:
                    b = 6;
                    break;
                case 1:
                    b = 0;
                    break;
                case 2:
                    b = 2;
                    break
            }
            c = 4 + this.id - g.playerCount;
            if (this.speed > 0 || g.gameplayMode != 13) b += Math.floor(g.globalTime / 16) % 2
        }
        return [c, b]
    };
    E.prototype.b = function () {
        this.k();
        var b = [0, 0];
        b = g.gameplayMode == 8 || g.gameplayMode == 14 ? [0, 3] : this.ghost ? this.r() : this.s();
        if (this.elBackgroundPos[0] != b[0] || this.elBackgroundPos[1] != b[1]) {
            this.elBackgroundPos[0] = b[0];
            this.elBackgroundPos[1] = b[1];
            b[0] *= 16;
            b[1] *= 16;
            g.changeElementBkPos(this.el, b[1], b[0], a)
        }
    };
    g.rand = function () {
        var b = 4294967296,
            c = 134775813;
        c = c * g.randSeed + 1;
        return (g.randSeed = c % b) / b
    };
    g.seed = function (b) {
        g.randSeed = b
    };
    g.getDistance = function (b, c) {
        return Math.sqrt((c[1] - b[1]) * (c[1] - b[1]) + (c[0] - b[0]) * (c[0] - b[0]))
    };
    g.getPlayfieldX = function (b) {
        return b*2 + -64
    };
    g.getPlayfieldY = function (b) {
        return b*2 + 0
    };
    g.getCorrectedSpritePos = function (b) {
        return b / 8 * 20 + 4
    };
    g.getDotElementId = function (b, c) {
        return "pcm-d" + b + "-" + c
    };
    g.showElementById = function (b, c) {
        var d = document.getElementById(b);
        if (d) d.style.visibility = c ? "visible" : "hidden"
    };
    g.getAbsoluteElPos = function (b) {
        var c = [0, 0];
        do {
            c[0] += b.offsetTop;
            c[1] += b.offsetLeft
        } while (b = b.offsetParent);
        return c
    };
    g.prepareElement = function (b, c, d) {
        c = g.getCorrectedSpritePos(parseInt(c, 10));
        d = g.getCorrectedSpritePos(parseInt(d, 10));
        if (g.useCss) {
            b.style.backgroundImage = "url(pacman10-hp-sprite-2.png)";
            b.style.backgroundPosition = -c + "px " + -d + "px";
            b.style.backgroundRepeat = "no-repeat"
        } else {
            b.style.overflow = "hidden";
            c = "display: block; position: relative; left: " + -c + "px; top: " + -d + "px";
            b.innerHTML = '<img style="' + c + '" src="pacman10-hp-sprite.png">'
        }
    };
    g.changeElementBkPos = function (b, c, d, f) {
        if (f) {
            c = g.getCorrectedSpritePos(c);
            d = g.getCorrectedSpritePos(d)
        }
        if (g.useCss) b.style.backgroundPosition = -c + "px " + -d + "px";
        else if (b.childNodes[0]) {
            b.childNodes[0].style.left = -c + "px";
            b.childNodes[0].style.top = -d + "px"
        }
    };
    g.determinePlayfieldDimensions = function () {
        g.playfieldWidth = 0;
        g.playfieldHeight = 0;
        for (var b in n) {
            var c = n[b];
            if (c.w) {
                c = c.x + c.w - 1;
                if (c > g.playfieldWidth) g.playfieldWidth = c
            } else {
                c = c.y + c.h - 1;
                if (c > g.playfieldHeight) g.playfieldHeight = c
            }
        }
    };
    g.preparePlayfield = function () {
        g.playfield = [];
        for (var b = 0; b <= g.playfieldHeight + 1; b++) {
            g.playfield[b * 8] = [];
            for (var c = -2; c <= g.playfieldWidth + 1; c++) g.playfield[b * 8][c * 8] = {
                path: 0,
                dot: 0,
                intersection: 0
            }
        }
    };
    g.preparePaths = function () {
        for (var b in n) {
            var c = n[b],
                d = c.type;
            if (c.w) {
                for (var f = c.y * 8, h = c.x * 8; h <= (c.x + c.w - 1) * 8; h += 8) {
                    g.playfield[f][h].path = a;
                    if (g.playfield[f][h].dot == 0) {
                        g.playfield[f][h].dot = 1;
                        g.dotsRemaining++
                    }
                    g.playfield[f][h].type = !d || h != c.x * 8 && h != (c.x + c.w - 1) * 8 ? d : 0
                }
                g.playfield[f][c.x * 8].intersection = a;
                g.playfield[f][(c.x + c.w - 1) * 8].intersection = a
            } else {
                h = c.x * 8;
                for (f = c.y * 8; f <= (c.y + c.h - 1) * 8; f += 8) {
                    if (g.playfield[f][h].path) g.playfield[f][h].intersection = a;
                    g.playfield[f][h].path = a;
                    if (g.playfield[f][h].dot == 0) {
                        g.playfield[f][h].dot = 1;
                        g.dotsRemaining++
                    }
                    g.playfield[f][h].type = !d || f != c.y * 8 && f != (c.y + c.h - 1) * 8 ? d : 0
                }
                g.playfield[c.y * 8][h].intersection = a;
                g.playfield[(c.y + c.h - 1) * 8][h].intersection = a
            }
        }
        for (b in o) if (o[b].w) for (h = o[b].x * 8; h <= (o[b].x + o[b].w - 1) * 8; h += 8) {
            g.playfield[o[b].y * 8][h].dot = 0;
            g.dotsRemaining--
        } else for (f = o[b].y * 8; f <= (o[b].y + o[b].h - 1) * 8; f += 8) {
            g.playfield[f][o[b].x * 8].dot = 0;
            g.dotsRemaining--
        }
    };
    g.prepareAllowedDirections = function () {
        for (var b = 8; b <= g.playfieldHeight * 8; b += 8) for (var c = 8; c <= g.playfieldWidth * 8; c += 8) {
            g.playfield[b][c].allowedDir = 0;
            if (g.playfield[b - 8][c].path) g.playfield[b][c].allowedDir += 1;
            if (g.playfield[b + 8][c].path) g.playfield[b][c].allowedDir += 2;
            if (g.playfield[b][c - 8].path) g.playfield[b][c].allowedDir += 4;
            if (g.playfield[b][c + 8].path) g.playfield[b][c].allowedDir += 8
        }
    };
    g.createDotElements = function () {
		for (var b = 8; b <= g.playfieldHeight * 8; b += 8) for (var c = 8; c <= g.playfieldWidth * 8; c += 8) if (g.playfield[b][c].dot) {
            var d = document.createElement("div");
            d.className = "pcm-d";
            d.id = g.getDotElementId(b, c);
            d.style.left = c*2 + -64 + "px";
            d.style.top = b*2 + 0 + "px";
            g.playfieldEl.appendChild(d)
        }
    };
    g.createEnergizerElements = function () {
        for (var b in p) {
            var c = p[b],
                d = g.getDotElementId(c.y * 8, c.x * 8);
            document.getElementById(d).className = "pcm-e";
            g.prepareElement(document.getElementById(d), 0, 144);
            g.playfield[c.y * 8][c.x * 8].dot = 2
        }
    };
    g.createFruitElement = function () {
        g.fruitEl = document.createElement("div");
        g.fruitEl.id = "pcm-f";
        g.fruitEl.style.left = g.getPlayfieldX(v[1]) + "px";
        g.fruitEl.style.top = g.getPlayfieldY(v[0]) + "px";
        g.prepareElement(g.fruitEl, -32, -16);
        g.playfieldEl.appendChild(g.fruitEl)
    };
    g.createPlayfieldElements = function () {
        g.doorEl = document.createElement("div");
        g.doorEl.id = "pcm-do";
        g.doorEl.style.display = "none";
        g.playfieldEl.appendChild(g.doorEl);
        g.createDotElements();
        g.createEnergizerElements();
        g.createFruitElement()
    };
    g.createActors = function () {
        g.actors = [];
        for (var b = 0; b < g.playerCount + 4; b++) {
            g.actors[b] = new E(b);
            if (b < g.playerCount) {
                g.actors[b].ghost = e;
                g.actors[b].mode = 1
            } else g.actors[b].ghost = a
        }
    };
    g.restartActors = function () {
        for (var b in g.actors) g.actors[b].A()
    };
    g.createActorElements = function () {
        for (var b in g.actors) g.actors[b].createElement()
    };
    g.createPlayfield = function () {
        g.playfieldEl = document.createElement("div");
        g.playfieldEl.id = "pcm-p";
        g.canvasEl.appendChild(g.playfieldEl)
    };
    g.resetPlayfield = function () {
        g.dotsRemaining = 0;
        g.dotsEaten = 0;
        g.playfieldEl.innerHTML = "";
        g.prepareElement(g.playfieldEl, 256, 0);
        g.determinePlayfieldDimensions();
        g.preparePlayfield();
        g.preparePaths();
        g.prepareAllowedDirections();
        g.createPlayfieldElements();
        g.createActorElements()
    };
    g.keyPressed = function (b) {
        var c = e;
        switch (b) {
            case 37:
                g.actors[0].requestedDir = 4;
                c = a;
                break;
            case 38:
                g.actors[0].requestedDir = 1;
                c = a;
                break;
            case 39:
                g.actors[0].requestedDir = 8;
                c = a;
                break;
            case 40:
                g.actors[0].requestedDir = 2;
                c = a;
                break;
            case 65:
                if (g.playerCount == 2) {
                    g.actors[1].requestedDir = 4;
                    c = a
                }
                break;
            case 83:
                if (g.playerCount == 2) {
                    g.actors[1].requestedDir = 2;
                    c = a
                }
                break;
            case 68:
                if (g.playerCount == 2) {
                    g.actors[1].requestedDir = 8;
                    c = a
                }
                break;
            case 87:
                if (g.playerCount == 2) {
                    g.actors[1].requestedDir = 1;
                    c = a
                }
                break
        }
        return c
    };
    g.handleKeyDown = function (b) {
        if (!b) b = window.event;
        if (g.keyPressed(b.keyCode)) if (b.preventDefault) b.preventDefault();
        else b.returnValue = e
    };
    g.canvasClicked = function (b, c) {
        var d = g.getAbsoluteElPos(g.canvasEl);
        b -= d[1] - -32;
        c -= d[0] - 0;
        d = g.actors[0];
        var f = g.getPlayfieldX(d.pos[1] + d.posDelta[1]) + 16,
            h = g.getPlayfieldY(d.pos[0] + d.posDelta[0]) + 32,
            j = Math.abs(b - f),
            k = Math.abs(c - h);
        if (j > 8 && k < j) d.requestedDir = b > f ? 8 : 4;
        else if (k > 8 && j < k) d.requestedDir = c > h ? 2 : 1
    };
    g.handleClick = function (b) {
        if (!b) b = window.event;
        g.canvasClicked(b.clientX, b.clientY)
    };
    g.registerTouch = function () {
        document.body.addEventListener("touchstart", g.handleTouchStart, a);
        g.canvasEl.addEventListener("touchstart", g.handleTouchStart, a);
        document.f && document.f.q && document.f.q.addEventListener("touchstart", g.handleTouchStart, a)
    };
    g.handleTouchStart = function (b) {
        g.touchDX = 0;
        g.touchDY = 0;
        if (b.touches.length == 1) {
            g.touchStartX = b.touches[0].pageX;
            g.touchStartY = b.touches[0].pageY;
            document.body.addEventListener("touchmove", g.handleTouchMove, a);
            document.body.addEventListener("touchend", g.handleTouchEnd, a)
        }
        b.preventDefault();
        b.stopPropagation()
    };
    g.handleTouchMove = function (b) {
        if (b.touches.length > 1) g.cancelTouch();
        else {
            g.touchDX = b.touches[0].pageX - g.touchStartX;
            g.touchDY = b.touches[0].pageY - g.touchStartY
        }
        b.preventDefault();
        b.stopPropagation()
    };
    g.handleTouchEnd = function (b) {
        if (g.touchDX == 0 && g.touchDY == 0) g.canvasClicked(g.touchStartX, g.touchStartY);
        else {
            var c = Math.abs(g.touchDX),
                d = Math.abs(g.touchDY);
            if (c < 8 && d < 8) g.canvasClicked(g.touchStartX, g.touchStartY);
            else if (c > 15 && d < c * 2 / 3) g.actors[0].requestedDir = g.touchDX > 0 ? 8 : 4;
            else if (d > 15 && c < d * 2 / 3) g.actors[0].requestedDir = g.touchDY > 0 ? 2 : 1
        }
        b.preventDefault();
        b.stopPropagation();
        g.cancelTouch()
    };
    g.cancelTouch = function () {
        document.body.removeEventListener("touchmove", g.handleTouchMove, a);
        document.body.removeEventListener("touchend", g.handleTouchEnd, a);
        g.touchStartX = null;
        g.touchStartY = null
    };
    g.addEventListeners = function () {
        if (window.addEventListener) {
            window.addEventListener("keydown", g.handleKeyDown, e);
            g.canvasEl.addEventListener("click", g.handleClick, e);
            g.registerTouch()
        } else {
            document.body.attachEvent("onkeydown", g.handleKeyDown);
            g.canvasEl.attachEvent("onclick", g.handleClick)
        }
    };
    g.startGameplay = function () {
        g.score = [0, 0];
        g.extraLifeAwarded = [e, e];
        g.lives = 3;
        g.level = 0;
        g.paused = e;
        g.globalTime = 0;
        g.newLevel(a)
    };
    g.restartGameplay = function (b) {
        g.seed(0);
        g.frightModeTime = 0;
        g.intervalTime = 0;
        g.gameplayModeTime = 0;
        g.fruitTime = 0;
        g.ghostModeSwitchPos = 0;
        g.ghostModeTime = g.levels.ghostModeSwitchTimes[0] * D;
        g.ghostExitingPenNow = e;
        g.ghostEyesCount = 0;
        g.tilesChanged = e;
        g.updateCruiseElroySpeed();
        g.hideFruit();
        g.resetForcePenLeaveTime();
        g.restartActors();
        g.updateActorPositions();
        g.switchMainGhostMode(2, a);
        for (var c = g.playerCount + 1; c < g.playerCount + 4; c++) g.actors[c].a(16);
        g.dotEatingChannel = [0, 0];
        g.dotEatingSoundPart = [1, 1];
        g.clearDotEatingNow();
        b ? g.changeGameplayMode(4) : g.changeGameplayMode(6)
    };
    g.initiateDoubleMode = function () {
        if (g.playerCount != 2) {
            g.stopAllAudio();
            g.changeGameplayMode(12)
			window.gameEngine.broadcastGameReady();
        }
    };
    g.newGame = function () {
        g.playerCount = 1;
        g.createChrome();
        g.createPlayfield();
        g.createActors();
        g.startGameplay();
		//console.debug(g);
		window.gameEngine.broadcastGameReady();
    };
    g.switchToDoubleMode = function () {
        g.playerCount = 2;
        g.createChrome();
        g.createPlayfield();
        g.createActors();
        g.startGameplay()
    };
    g.insertCoin = function () {
        g.gameplayMode == 8 || g.gameplayMode == 14 ? g.newGame() : g.initiateDoubleMode()
    };
    g.createKillScreenElement = function (b, c, d, f, h) {
        var j = document.createElement("div");
        j.style.left = b + "px";
        j.style.top = c + "px";
        j.style.width = d + "px";
        j.style.height = f + "px";
        j.style.zIndex = 119;
        if (h) {
            j.style.background = "url(pacman10-hp-sprite.png) -" + g.killScreenTileX + "px -" + g.killScreenTileY + "px no-repeat";
            g.killScreenTileY += 8
        } else j.style.background = "black";
        g.playfieldEl.appendChild(j)
    };
    g.killScreen = function () {
        g.seed(0);
        g.canvasEl.style.visibility = "";
        g.createKillScreenElement(272, 0, 200, 80, e);
        g.createKillScreenElement(280, 80, 192, 56, e);
        g.killScreenTileX = 80;
        g.killScreenTileY = 0;
        for (var b = 280; b <= 472; b += 8) for (var c = 0; c <= 136; c += 8) {
            if (g.rand() < 0.03) {
                g.killScreenTileX = Math.floor(g.rand() * 25) * 10;
                g.killScreenTileY = Math.floor(g.rand() * 2) * 10
            }
            g.createKillScreenElement(b, c, 8, 8, a)
        }
        g.changeGameplayMode(14)
    };
    g.newLevel = function (b) {
        g.level++;
        g.levels = g.level >= z.length ? z[z.length - 1] : z[g.level];
        g.levels.frightTime = Math.round(g.levels.frightTime * D);
        g.levels.frightTotalTime = g.levels.frightTime + g.timing[1] * (g.levels.frightBlinkCount * 2 - 1);
        for (var c in g.actors) g.actors[c].dotCount = 0;
        g.alternatePenLeavingScheme = e;
        g.lostLifeOnThisLevel = e;
        g.updateChrome();
        g.resetPlayfield();
        g.restartGameplay(b);
        g.level == 256 && g.killScreen()
    };
    g.newLife = function () {
        g.lostLifeOnThisLevel = a;
        g.alternatePenLeavingScheme = a;
        g.alternateDotCount = 0;
        g.lives--;
        g.updateChromeLives();
        g.lives == -1 ? g.changeGameplayMode(8) : g.restartGameplay(e)
		//console.log(g.lives);
		if(g.lives == -1){
			window.gameEngine.broadcastEndGame();
		}
    };
    g.switchMainGhostMode = function (b, c) {
        if (b == 4 && g.levels.frightTime == 0) for (var d in g.actors) {
            var f = g.actors[d];
            if (f.ghost) f.reverseDirectionsNext = a
        } else {
            f = g.mainGhostMode;
            if (b == 4 && g.mainGhostMode != 4) g.lastMainGhostMode = g.mainGhostMode;
            g.mainGhostMode = b;
            if (b == 4 || f == 4) g.playAmbientSound();
            switch (b) {
                case 1:
                case 2:
                    g.currentPlayerSpeed = g.levels.playerSpeed * 0.8;
                    g.currentDotEatingSpeed = g.levels.dotEatingSpeed * 0.8;
                    break;
                case 4:
                    g.currentPlayerSpeed = g.levels.playerFrightSpeed * 0.8;
                    g.currentDotEatingSpeed = g.levels.dotEatingFrightSpeed * 0.8;
                    g.frightModeTime = g.levels.frightTotalTime;
                    g.modeScoreMultiplier = 1;
                    break
            }
            for (d in g.actors) {
                f = g.actors[d];
                if (f.ghost) {
                    if (b != 64 && !c) f.modeChangedWhileInPen = a;
                    if (b == 4) f.eatenInThisFrightMode = e;
                    if (f.mode != 8 && f.mode != 16 && f.mode != 32 && f.mode != 128 && f.mode != 64 || c) {
                        if (!c && f.mode != 4 && f.mode != b) f.reverseDirectionsNext = a;
                        f.a(b)
                    }
                } else {
                    f.fullSpeed = g.currentPlayerSpeed;
                    f.dotEatingSpeed = g.currentDotEatingSpeed;
                    f.tunnelSpeed = g.currentPlayerSpeed;
                    f.d()
                }
            }
        }
    };
    g.figureOutPenLeaving = function () {
        if (g.alternatePenLeavingScheme) {
            g.alternateDotCount++;
            switch (g.alternateDotCount) {
                case m[1]:
                    g.actors[g.playerCount + 1].freeToLeavePen = a;
                    break;
                case m[2]:
                    g.actors[g.playerCount + 2].freeToLeavePen = a;
                    break;
                case m[3]:
                    if (g.actors[g.playerCount + 3].mode == 16) g.alternatePenLeavingScheme = e;
                    break
            }
        } else if (g.actors[g.playerCount + 1].mode == 16 || g.actors[g.playerCount + 1].mode == 8) {
            g.actors[g.playerCount + 1].dotCount++;
            if (g.actors[g.playerCount + 1].dotCount >= g.levels.penLeavingLimits[1]) g.actors[g.playerCount + 1].freeToLeavePen = a
        } else if (g.actors[g.playerCount + 2].mode == 16 || g.actors[g.playerCount + 2].mode == 8) {
            g.actors[g.playerCount + 2].dotCount++;
            if (g.actors[g.playerCount + 2].dotCount >= g.levels.penLeavingLimits[2]) g.actors[g.playerCount + 2].freeToLeavePen = a
        } else if (g.actors[g.playerCount + 3].mode == 16 || g.actors[g.playerCount + 3].mode == 8) {
            g.actors[g.playerCount + 3].dotCount++;
            if (g.actors[g.playerCount + 3].dotCount >= g.levels.penLeavingLimits[3]) g.actors[g.playerCount + 3].freeToLeavePen = a
        }
    };
    g.resetForcePenLeaveTime = function () {
        g.forcePenLeaveTime = g.levels.penForceTime * D
    };
    g.dotEaten = function (b, c) {
        g.dotsRemaining--;
        g.dotsEaten++;
        g.actors[b].c(1);
        g.playDotEatingSound(b);
        if (g.playfield[c[0]][c[1]].dot == 2) {
            g.switchMainGhostMode(4, e);
            g.addToScore(50, b)
        } else g.addToScore(10, b);
        var d = document.getElementById(g.getDotElementId(c[0], c[1]));
        d.style.display = "none";
        g.playfield[c[0]][c[1]].dot = 0;
        g.updateCruiseElroySpeed();
        g.resetForcePenLeaveTime();
        g.figureOutPenLeaving();
        if (g.dotsEaten == 10 || g.dotsEaten == 170) g.showFruit();
        g.dotsRemaining == 0 && g.finishLevel();
        g.playAmbientSound()
    };
    g.getFruitSprite = function (b) {
        var c = b <= 4 ? 128 : 160;
        b = 128 + 16 * ((b - 1) % 4);
        return [c, b]
    };
    g.getFruitScoreSprite = function (b) {
        var c = 128;
        b = 16 * (b - 1);
        return [c, b]
    };
    g.hideFruit = function () {
        g.fruitShown = e;
        g.changeElementBkPos(g.fruitEl, 32, 16, a)
    };
    g.showFruit = function () {
        g.fruitShown = a;
        var b = g.getFruitSprite(g.levels.fruit);
        g.changeElementBkPos(g.fruitEl, b[0], b[1], a);
        g.fruitTime = g.timing[15] + (g.timing[16] - g.timing[15]) * g.rand()
    };
    g.eatFruit = function (b) {
        if (g.fruitShown) {
            g.playSound("fruit", 0);
            g.fruitShown = e;
            var c = g.getFruitScoreSprite(g.levels.fruit);
            g.changeElementBkPos(g.fruitEl, c[0], c[1], a);
            g.fruitTime = g.timing[14];
            g.addToScore(g.levels.fruitScore, b)
        }
    };
    g.updateActorTargetPositions = function () {
        for (var b = g.playerCount; b < g.playerCount + 4; b++) g.actors[b].B()
    };
    g.moveActors = function () {
        for (var b in g.actors) g.actors[b].move()
    };
    g.ghostDies = function (b, c) {
        g.playSound("eating-ghost", 0);
        g.addToScore(200 * g.modeScoreMultiplier, c);
        g.modeScoreMultiplier *= 2;
        g.ghostBeingEatenId = b;
        g.playerEatingGhostId = c;
        g.changeGameplayMode(1)
    };
    g.playerDies = function (b) {
        g.playerDyingId = b;
        g.changeGameplayMode(2)
    };
    g.detectCollisions = function () {
        g.tilesChanged = e;
        for (var b = g.playerCount; b < g.playerCount + 4; b++) for (var c = 0; c < g.playerCount; c++) if (g.actors[b].tilePos[0] == g.actors[c].tilePos[0] && g.actors[b].tilePos[1] == g.actors[c].tilePos[1]) if (g.actors[b].mode == 4) {
            g.ghostDies(b, c);
            return
        } else g.actors[b].mode != 8 && g.actors[b].mode != 16 && g.actors[b].mode != 32 && g.actors[b].mode != 128 && g.actors[b].mode != 64 && g.playerDies(c)
    };
    g.updateCruiseElroySpeed = function () {
        var b = g.levels.ghostSpeed * 0.8;
        if (!g.lostLifeOnThisLevel || g.actors[g.playerCount + 3].mode != 16) {
            var c = g.levels;
            if (g.dotsRemaining < c.elroyDotsLeftPart2) b = c.elroySpeedPart2 * 0.8;
            else if (g.dotsRemaining < c.elroyDotsLeftPart1) b = c.elroySpeedPart1 * 0.8
        }
        if (b != g.cruiseElroySpeed) {
            g.cruiseElroySpeed = b;
            g.actors[g.playerCount].d()
        }
    };
    g.getSpeedIntervals = function (b) {
        if (!g.speedIntervals[b]) {
            var c = 0,
                d = 0;
            g.speedIntervals[b] = [];
            for (var f = 0; f < D; f++) {
                c += b;
                if (Math.floor(c) > d) {
                    g.speedIntervals[b].push(a);
                    d = Math.floor(c)
                } else g.speedIntervals[b].push(e)
            }
        }
        return g.speedIntervals[b]
    };
    g.finishLevel = function () {
        g.changeGameplayMode(9)
    };
    g.changeGameplayMode = function (b) {
        g.gameplayMode = b;
        if (b != 13) for (var c = 0; c < g.playerCount + 4; c++) g.actors[c].b();
        switch (b) {
            case 0:
                g.playAmbientSound();
                break;
            case 2:
                g.stopAllAudio();
                g.gameplayModeTime = g.timing[3];
                break;
            case 3:
                g.playerDyingId == 0 ? g.playSound("death", 0) : g.playSound("death-double", 0);
                g.gameplayModeTime = g.timing[4];
                break;
            case 6:
                g.canvasEl.style.visibility = "hidden";
                g.gameplayModeTime = g.timing[5];
                break;
            case 7:
                g.stopAllAudio();
                g.canvasEl.style.visibility = "";
                g.doorEl.style.display = "block";
                b = document.createElement("div");
                b.id = "pcm-re";
                g.prepareElement(b, 160, 0);
                g.playfieldEl.appendChild(b);
                g.gameplayModeTime = g.timing[6];
                break;
            case 4:
                g.doorEl.style.display = "block";
                b = document.createElement("div");
                b.id = "pcm-re";
                g.prepareElement(b, 160, 0);
                g.playfieldEl.appendChild(b);
                g.gameplayModeTime = g.timing[7];
                g.stopAllAudio();
                g.playerCount == 2 ? g.playSound("start-music-double", 0, a) : g.playSound("start-music", 0, a);
                break;
            case 5:
                g.lives--;
                g.updateChromeLives();
                g.gameplayModeTime = g.timing[8];
                break;
            case 8:
            case 14:
                b = document.getElementById("pcm-re");
                google.dom.remove(b);
                g.stopAllAudio();
                b = document.createElement("div");
                b.id = "pcm-go";
                g.prepareElement(b, 8, 152);
                g.playfieldEl.appendChild(b);
                g.gameplayModeTime = g.timing[9];
                break;
            case 9:
                g.stopAllAudio();
                g.gameplayModeTime = g.timing[10];
                break;
            case 10:
                g.doorEl.style.display = "none";
                g.gameplayModeTime = g.timing[11];
                break;
            case 11:
                g.canvasEl.style.visibility = "hidden";
                g.gameplayModeTime = g.timing[12];
                break;
            case 12:
                g.playfieldEl.style.visibility = "hidden";
                g.gameplayModeTime = g.timing[13];
                break;
            case 1:
                g.gameplayModeTime = g.timing[2];
                break;
            case 13:
                g.startCutscene();
                break
        }
    };
    g.showChrome = function (b) {
        g.showElementById("pcm-sc-1-l", b);
        g.showElementById("pcm-sc-2-l", b);
        g.showElementById("pcm-sc-1", b);
        g.showElementById("pcm-sc-2", b);
        g.showElementById("pcm-li", b);
        g.showElementById("pcm-so", b)
    };
    g.toggleSound = function (b) {
        b = window.event || b;
        b.cancelBubble = a;
        if (google.pacManSound) {
            g.userDisabledSound = a;
            g.stopAllAudio();
            google.pacManSound = e
        } else {
            google.pacManSound = a;
            g.playAmbientSound()
        }
        g.updateSoundIcon();
        return b.returnValue = e
    };
    g.updateSoundIcon = function () {
        if (g.soundEl) google.pacManSound ? g.changeElementBkPos(g.soundEl, 430, 206, e) : g.changeElementBkPos(g.soundEl, 472, 206, e)
    };
    g.startCutscene = function () {
        g.playfieldEl.style.visibility = "hidden";
        g.canvasEl.style.visibility = "";
        g.showChrome(e);
        g.cutsceneCanvasEl = document.createElement("div");
        g.cutsceneCanvasEl.id = "pcm-cc";
        g.canvasEl.appendChild(g.cutsceneCanvasEl);
        g.cutscene = B[g.cutsceneId];
        g.cutsceneSequenceId = -1;
        g.frightModeTime = g.levels.frightTotalTime;
        g.cutsceneActors = [];
        for (var b in g.cutscene.actors) {
            var c = g.cutscene.actors[b].id;
            if (c > 0) c += g.playerCount - 1;
            var d = document.createElement("div");
            d.className = "pcm-ac";
            d.id = "actor" + c;
            g.prepareElement(d, 0, 0);
            c = new E(c);
            c.el = d;
            c.elBackgroundPos = [0, 0];
            c.elPos = [0, 0];
            c.pos = [g.cutscene.actors[b].y * 8, g.cutscene.actors[b].x * 8];
            c.posDelta = [0, 0];
            c.ghost = g.cutscene.actors[b].ghost;
            g.cutsceneCanvasEl.appendChild(d);
            g.cutsceneActors.push(c)
        }
        g.cutsceneNextSequence();
        g.stopAllAudio();
        g.playAmbientSound()
    };
    g.stopCutscene = function () {
        g.playfieldEl.style.visibility = "";
        google.dom.remove(g.cutsceneCanvasEl);
        g.showChrome(a);
        g.newLevel(e)
    };
    g.cutsceneNextSequence = function () {
        g.cutsceneSequenceId++;
        if (g.cutscene.sequence.length == g.cutsceneSequenceId) g.stopCutscene();
        else {
            var b = g.cutscene.sequence[g.cutsceneSequenceId];
            g.cutsceneTime = b.time * D;
            for (var c in g.cutsceneActors) {
                var d = g.cutsceneActors[c];
                d.dir = b.moves[c].dir;
                d.speed = b.moves[c].speed;
                if (b.moves[c].elId) d.el.id = b.moves[c].elId;
                if (b.moves[c].mode) d.mode = b.moves[c].mode;
                d.b()
            }
        }
    };
    g.checkCutscene = function () {
        g.cutsceneTime <= 0 && g.cutsceneNextSequence()
    };
    g.advanceCutscene = function () {
        for (var b in g.cutsceneActors) {
            var c = g.cutsceneActors[b],
                d = l[c.dir];
            c.pos[d.axis] += d.increment * c.speed;
            c.b()
        }
        g.cutsceneTime--
    };
    g.updateActorPositions = function () {
        for (var b in g.actors) g.actors[b].k()
    };
    g.blinkEnergizers = function () {
        switch (g.gameplayMode) {
            case 4:
            case 5:
            case 6:
            case 7:
            case 9:
            case 10:
            case 11:
            case 12:
                g.playfieldEl.className = "";
                break;
            case 8:
            case 14:
                g.playfieldEl.className = "blk";
                break;
            default:
                if (g.globalTime % (g.timing[0] * 2) == 0) g.playfieldEl.className = "";
                else if (g.globalTime % (g.timing[0] * 2) == g.timing[0]) g.playfieldEl.className = "blk";
                break
        }
    };
    g.blinkScoreLabels = function () {
        if (g.gameplayMode != 13) {
            var b = "";
            if (g.globalTime % (g.timing[17] * 2) == 0) b = "visible";
            else if (g.globalTime % (g.timing[17] * 2) == g.timing[17]) b = "hidden";
            if (b) for (var c = 0; c < g.playerCount; c++) g.scoreLabelEl[c].style.visibility = b
        }
    };
    g.finishFrightMode = function () {
        g.switchMainGhostMode(g.lastMainGhostMode, e)
    };
    g.handleGameplayModeTimer = function () {
        if (g.gameplayModeTime) {
            g.gameplayModeTime--;
            switch (g.gameplayMode) {
                case 2:
                case 3:
                    for (var b = 0; b < g.playerCount + 4; b++) g.actors[b].b();
                    break;
                case 10:
                    //Math.floor(g.gameplayModeTime / (g.timing[11] / 8)) % 2 == 0 ? g.changeElementBkPos(g.playfieldEl, 322, 2, e) : g.changeElementBkPos(g.playfieldEl, 322, 138, e)
					Math.floor(g.gameplayModeTime / (g.timing[11] / 8)) % 2 == 0 ? g.changeElementBkPos(g.playfieldEl, 644, 4, e) : g.changeElementBkPos(g.playfieldEl, 644, 276, e)
            }
            if (g.gameplayModeTime <= 0) {
                g.gameplayModeTime = 0;
                switch (g.gameplayMode) {
                    case 1:
                        g.changeGameplayMode(0);
                        g.ghostEyesCount++;
                        g.playAmbientSound();
                        g.actors[g.ghostBeingEatenId].el.className =
                            "pcm-ac";
                        g.actors[g.ghostBeingEatenId].a(8);
                        var c = e;
                        for (b = g.playerCount; b < g.playerCount + 4; b++) if (g.actors[b].mode == 4 || (g.actors[b].mode == 16 || g.actors[b].mode == 128) && !g.actors[b].eatenInThisFrightMode) {
                            c = a;
                            break
                        }
                        c || g.finishFrightMode();
                        break;
                    case 2:
                        g.changeGameplayMode(3);
                        break;
                    case 3:
                        g.newLife();
                        break;
                    case 4:
                        g.changeGameplayMode(5);
                        break;
                    case 6:
                        g.changeGameplayMode(7);
                        break;
                    case 7:
                    case 5:
                        b = document.getElementById("pcm-re");
                        google.dom.remove(b);
                        g.changeGameplayMode(0);
                        break;
                    case 8:
                        b = document.getElementById("pcm-go");
                        google.dom.remove(b);
                        google.pacManQuery && google.pacManQuery();
                        break;
                    case 9:
                        g.changeGameplayMode(10);
                        break;
                    case 10:
                        g.changeGameplayMode(11);
                        break;
                    case 11:
                        if (g.levels.cutsceneId) {
                            g.cutsceneId = g.levels.cutsceneId;
                            g.changeGameplayMode(13)
                        } else {
                            g.canvasEl.style.visibility = "";
                            g.newLevel(e)
                        }
                        break;
                    case 12:
                        g.playfieldEl.style.visibility = "";
                        g.canvasEl.style.visibility = "";
                        g.switchToDoubleMode();
                        break
                }
            }
        }
    };
    g.handleFruitTimer = function () {
        if (g.fruitTime) {
            g.fruitTime--;
            g.fruitTime <= 0 && g.hideFruit()
        }
    };
    g.handleGhostModeTimer = function () {
        if (g.frightModeTime) {
            g.frightModeTime--;
            if (g.frightModeTime <= 0) {
                g.frightModeTime = 0;
                g.finishFrightMode()
            }
        } else if (g.ghostModeTime > 0) {
            g.ghostModeTime--;
            if (g.ghostModeTime <= 0) {
                g.ghostModeTime = 0;
                g.ghostModeSwitchPos++;
                if (g.levels.ghostModeSwitchTimes[g.ghostModeSwitchPos]) {
                    g.ghostModeTime = g.levels.ghostModeSwitchTimes[g.ghostModeSwitchPos] * D;
                    switch (g.mainGhostMode) {
                        case 2:
                            g.switchMainGhostMode(1, e);
                            break;
                        case 1:
                            g.switchMainGhostMode(2, e);
                            break
                    }
                }
            }
        }
    };
    g.handleForcePenLeaveTimer = function () {
        if (g.forcePenLeaveTime) {
            g.forcePenLeaveTime--;
            if (g.forcePenLeaveTime <= 0) {
                for (var b = 1; b <= 3; b++) if (g.actors[g.playerCount + b].mode == 16) {
                    g.actors[g.playerCount + b].freeToLeavePen = a;
                    break
                }
                g.resetForcePenLeaveTime()
            }
        }
    };
    g.handleTimers = function () {
        if (g.gameplayMode == 0) {
            g.handleForcePenLeaveTimer();
            g.handleFruitTimer();
            g.handleGhostModeTimer()
        }
        g.handleGameplayModeTimer()
    };
    g.tick = function () {
        var b = (new Date).getTime();
        g.lastTimeDelta += b - g.lastTime - g.tickInterval;
        if (g.lastTimeDelta > 100) g.lastTimeDelta = 100;
        if (g.canDecreaseFps && g.lastTimeDelta > 50) {
            g.lastTimeSlownessCount++;
            g.lastTimeSlownessCount == 20 && g.decreaseFps()
        }
        var c = 0;
        if (g.lastTimeDelta > g.tickInterval) {
            c = Math.floor(g.lastTimeDelta / g.tickInterval);
            g.lastTimeDelta -= g.tickInterval * c
        }
        g.lastTime = b;
        if (g.gameplayMode == 13) {
            for (b = 0; b < g.tickMultiplier + c; b++) {
                g.advanceCutscene();
                g.intervalTime = (g.intervalTime + 1) % D;
                g.globalTime++
            }
            g.checkCutscene();
            g.blinkScoreLabels()
        } else for (b = 0; b < g.tickMultiplier + c; b++) {
            g.moveActors();
            if (g.gameplayMode == 0) if (g.tilesChanged) {
                g.detectCollisions();
                g.updateActorTargetPositions()
            }
            g.globalTime++;
            g.intervalTime = (g.intervalTime + 1) % D;
            g.blinkEnergizers();
            g.blinkScoreLabels();
            g.handleTimers()
        }
    };
    g.extraLife = function (b) {
        g.playSound("extra-life", 0);
        g.extraLifeAwarded[b] = a;
        g.lives++;
        if (g.lives > 5) g.lives = 5;
        g.updateChromeLives()
    };
    g.addToScore = function (b, c) {
        g.score[c] += b;
        !g.extraLifeAwarded[c] && g.score[c] > 1E4 && g.extraLife(c);
        g.updateChromeScore(c)
    };
    g.updateChrome = function () {
        g.updateChromeLevel();
        g.updateChromeLives();
        for (var b = 0; b < g.playerCount; b++) g.updateChromeScore(b)
    };
    g.updateChromeScore = function (b) {
        var c = g.score[b].toString();
        if (c.length > g.scoreDigits) c = c.substr(c.length - g.scoreDigits, g.scoreDigits);
        for (var d = 0; d < g.scoreDigits; d++) {
            var f = document.getElementById("pcm-sc-" + (b + 1) + "-" + d),
                h = c.substr(d, 1);
            h ? g.changeElementBkPos(f, 8 + 8 * parseInt(h, 10), 144, a) : g.changeElementBkPos(f, 48, 0, a)
        }
    };
    g.updateChromeLives = function () {
        g.livesEl.innerHTML = "";
        for (var b = 0; b < g.lives; b++) {
            var c = document.createElement("div");
            c.className = "pcm-lif";
            g.prepareElement(c, 64, 129);
            g.livesEl.appendChild(c)
        }
    };
    g.updateChromeLevel = function () {
        g.levelEl.innerHTML = "";
        for (var b = g.level; b >= Math.max(g.level - 4 + 1, 1); b--) {
            var c = b >= z.length ? z[z.length - 1].fruit : z[b].fruit,
                d = document.createElement("div");
            c = g.getFruitSprite(c);
            g.prepareElement(d, c[0], c[1]);
            g.levelEl.appendChild(d)
        }
        g.levelEl.style.marginTop = (4 - Math.min(g.level, 4)) * 16 + "px"
    };
    g.createChrome = function () {
        g.canvasEl.innerHTML = "";
        g.scoreDigits = g.playerCount == 1 ? 10 : 5;
        g.scoreLabelEl = [];
        g.scoreLabelEl[0] = document.createElement("div");
        g.scoreLabelEl[0].id = "pcm-sc-1-l";
        g.prepareElement(g.scoreLabelEl[0], 160, 56);
        g.canvasEl.appendChild(g.scoreLabelEl[0]);
        g.scoreEl = [];
        g.scoreEl[0] = document.createElement("div");
        g.scoreEl[0].id = "pcm-sc-1";
        for (var b = 0; b < g.scoreDigits; b++) {
            var c = document.createElement("div");
            c.id = "pcm-sc-1-" + b;
            c.style.top = b * 16 + "px";
            c.style.left = 0;
            c.style.position = "absolute";
            c.style.width = "16px";
            c.style.height = "16px";
            g.prepareElement(c, 48, 0);
            g.scoreEl[0].appendChild(c)
        }
        g.canvasEl.appendChild(g.scoreEl[0]);
        g.livesEl = document.createElement("div");
        g.livesEl.id = "pcm-li";
        g.canvasEl.appendChild(g.livesEl);
        g.levelEl = document.createElement("div");
        g.levelEl.id = "pcm-le";
        g.canvasEl.appendChild(g.levelEl);
        if (g.playerCount == 2) {
            g.scoreLabelEl[1] = document.createElement("div");
            g.scoreLabelEl[1].id = "pcm-sc-2-l";
            g.prepareElement(g.scoreLabelEl[1], 160, 64);
            g.canvasEl.appendChild(g.scoreLabelEl[1]);
            g.scoreEl[1] = document.createElement("div");
            g.scoreEl[1].id = "pcm-sc-2";
            for (b = 0; b < g.scoreDigits; b++) {
                c = document.createElement("div");
                c.id = "pcm-sc-2-" + b;
                c.style.top = b * 16 + "px";
                c.style.left = 0;
                c.style.position = "absolute";
                c.style.width = "16px";
                c.style.height = "16px";
                g.prepareElement(c, 48, 0);
                g.scoreEl[1].appendChild(c)
            }
            g.canvasEl.appendChild(g.scoreEl[1])
        }
        if (g.soundAvailable) {
            g.soundEl = document.createElement("div");
            g.soundEl.id = "pcm-so";
            g.prepareElement(g.soundEl, -32, -16);
            g.canvasEl.appendChild(g.soundEl);
            g.soundEl.onclick = g.toggleSound;
            g.updateSoundIcon()
        }
    };
    g.clearDotEatingNow = function () {
        g.dotEatingNow = [e, e];
        g.dotEatingNext = [e, e]
    };
    g.playSound = function (b, c, d, lp) {
        if (!(!g.soundAvailable || !google.pacManSound || g.paused)) {
            d || g.stopSoundChannel(c);
			
            try {
				var source = g.context.createBufferSource();
				source.buffer = g.sound[b];
				if(lp) source.loop = true;
				source.connect(g.context.destination);
				source.start(0);
            } catch (f) {
				console.debug("**** playSound catch " + f);
                g.soundAvailable = e
            }
        }
    };
	g.stopSound = function (b) {
		// To-do, not implemented.
		//console.debug("**** stopSound " + b );
    };
    g.stopSoundChannel = function (b) {
        if (g.soundAvailable) try {
            //g.flashSoundPlayer.stopChannel(b)
        } catch (c) {
			console.debug("**** stopSoundChannel catch");
            g.soundAvailable = e
        }
    };
    g.stopAllAudio = function () {
        if (g.soundAvailable) {
            try {
                g.stopAmbientTrack();
            } catch (b) {
				console.debug("**** stopAllAudio catch");
                g.soundAvailable = e
            }
            for (var c = 0; c < 5; c++) g.stopSoundChannel(c)
        }
    };
    g.playDotEatingSound = function (b) {
        if (g.soundAvailable && google.pacManSound) if (g.gameplayMode == 0) if (g.dotEatingNow[b]) g.dotEatingNext[b] = a;
        else {
            if (b == 0) {
                var c = g.dotEatingSoundPart[b] == 1 ? "eating-dot-1" : "eating-dot-2";
                g.playSound(c, 1 + g.dotEatingChannel[b], a);
                //g.dotTimer = window.setInterval(g.repeatDotEatingSoundPacMan, 150)
            } else {
                g.playSound("eating-dot-double", 3 + g.dotEatingChannel[b], a);
                //g.dotTimerMs = window.setInterval(g.repeatDotEatingSoundMsPacMan, 150)
            }
            g.dotEatingChannel[b] = (g.dotEatingChannel[b] + 1) % 2;
            g.dotEatingSoundPart[b] = 3 - g.dotEatingSoundPart[b]
        }
    };
    g.repeatDotEatingSound = function (b) {
        g.dotEatingNow[b] = e;
        if (g.dotEatingNext[b]) {
            g.dotEatingNext[b] = e;
            g.playDotEatingSound(b)
        }
    };
    g.repeatDotEatingSoundPacMan = function () {
        g.repeatDotEatingSound(0)
    };
    g.repeatDotEatingSoundMsPacMan = function () {
        g.repeatDotEatingSound(1)
    };
    g.playAmbientSound = function () {
		//console.debug("****playAmbientSound " +  g.soundAvailable + google.pacManSound);
		
        if (g.soundAvailable && google.pacManSound) {
            var b = 0;
            if (g.gameplayMode == 0 || g.gameplayMode == 1) b = g.ghostEyesCount ? "ambient-eyes" : g.mainGhostMode == 4 ? "ambient-fright" : g.dotsEaten > 241 ? "ambient-4" : g.dotsEaten > 207 ? "ambient-3" : g.dotsEaten > 138 ? "ambient-2" : "ambient-1";
            else if (g.gameplayMode == 13) b = "cutscene";
            if (b) try {
				g.playAmbientTrack(b);
            } catch (c) {
				console.debug("**** playAmbientSound " + "catch");
                g.soundAvailable = e
            }
        }
		
    };
	g.playAmbientTrack = function(b)
	{
		//console.debug(g.ambientTrackName +  ' ' + b);
		if(0 == 1){
			if (b != g.ambientTrackName){
				g.stopAmbientTrack();
				g.ambientTrackName = b;
			}
			g.repeatAmbientTrack();
		}else{
		var _loc_2 = NaN;
		if (b != g.ambientTrackName){
			g.stopAmbientTrack();
			g.ambientTrackName = b;
			g.ambientChannelName = "ambient-1";

			switch(g.ambientTrackName){
				case "ambient-1":
				{
					_loc_2 = 381;
					break;
				}
				case "ambient-2":
				{
					_loc_2 = 327;
					break;
				}
				case "ambient-3":
				{
					_loc_2 = 298;
					break;
				}
				case "ambient-4":
				{
					_loc_2 = 270;
					break;
				}
				case "ambient-fright":
				{
					_loc_2 = 529;
					break;
				}
				case "ambient-eyes":
				{
					_loc_2 = 264;
					break;
				}
				case "cutscene":
				{
					_loc_2 = 5312;
					break;
				}
				default:
				{
					break;
				}
			}
			
			g.ambientTrackIntervalId = window.setInterval(g.repeatAmbientTrack, _loc_2 - 30);
			g.playSound(g.ambientTrackName);
		}
		}
	};
	
	g.stopAmbientTrack = function() {
        if(g.ambientTrackIntervalId){
			window.clearInterval(g.ambientTrackIntervalId);
		}
		g.stopSound("ambient-1");
		g.stopSound("ambient-2");
        g.ambientTrackName = "";
        return;
	};
	
	g.repeatAmbientTrack = function()
	{
		if(g.ambientChannelName == "ambient-1")
		{
			g.ambientChannelName == "ambient-2"
		}
		else
		{
			g.ambientChannelName == "ambient-1"
		}
		g.playSound(g.ambientTrackName, 0, false, false);
	};
	
    g.initializeTickTimer = function () {
        window.clearInterval(g.tickTimer);
        g.fps = C[g.fpsChoice];
        g.tickInterval = 1E3 / g.fps;
        g.tickMultiplier = D / g.fps;
        g.timing = {};
        for (var b in w) {
            var c = !google.pacManSound && (b == 7 || b == 8) ? 1 : w[b];
            g.timing[b] = Math.round(c * D)
        }
        g.lastTime = (new Date).getTime();
        g.lastTimeDelta = 0;
        g.lastTimeSlownessCount = 0;
        g.tickTimer = window.setInterval(g.tick, g.tickInterval)
    };
    g.decreaseFps = function () {
        if (g.fpsChoice < C.length - 1) {
            g.fpsChoice++;
            g.initializeTickTimer();
            if (g.fpsChoice == C.length - 1) g.canDecreaseFps = e
        }
    };
    g.addCss = function () {
        //var b = "#pcm-c {  width: 554px;  border-top: 25px solid black;  padding-bottom: 25px;  height: 136px;  position: relative;  background: black;  outline: 0;  overflow: hidden;  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}#pcm-c * {  position: absolute;  overflow: hidden;}#pcm-p,#pcm-cc {  left: 45px;  width: 464px;  height: 136px;  z-index: 99;  overflow: hidden;}#pcm-p .pcm-d {  width: 2px;  height: 2px;  margin-left: 3px;  margin-top: 3px;  background: #f8b090;  z-index: 100;}#pcm-p .pcm-e {  width: 8px;  height: 8px;  z-index: 101;}#pcm-sc-1 {  left: 18px;  top: 16px;  width: 8px;  height: 56px;  position: absolute;  overflow: hidden;}#pcm-sc-2 {  left: 18px;  top: 80px;  width: 8px;  height: 56px;  position: absolute;  overflow: hidden;}#pcm-le {  position: absolute;  left: 515px;  top: 74px;  height: 64px;  width: 32px;} #pcm-le div {  position: relative;}#pcm-sc-1-l {    left: -2px;  top: 0;  width: 48px;  height: 8px;}#pcm-sc-2-l {    left: -2px;  top: 64px;  width: 48px;  height: 8px;}#pcm-so {  left: 7px;  top: 116px;  width: 12px;  height: 12px;  border: 8px solid black;  cursor: pointer;}#pcm-li {  position: absolute;  left: 523px;  top: 0;  height: 80px;  width: 16px;}#pcm-li .pcm-lif {  position: relative;  width: 16px;  height: 12px;  margin-bottom: 3px;}#pcm-p.blk .pcm-e {  visibility: hidden;}#pcm-c .pcm-ac {  width: 16px;  height: 16px;  margin-left: -4px;  margin-top: -4px;  z-index: 110;}#pcm-c .pcm-n {  z-index: 111;}#pcm-c #pcm-stck {  z-index: 109;}#pcm-c #pcm-gbug {  width: 32px;}#pcm-c #pcm-bpcm {  width: 32px;  height: 32px;  margin-left: -20px;  margin-top: -20px;}#pcm-f,#pcm-le div {  width: 32px;  height: 16px;  z-index: 105;}#pcm-f {  margin-left: -8px;  margin-top: -4px;}#pcm-do {  width: 19px;  height: 2px;  left: 279px;  top: 46px;  overflow: hidden;  position: absolute;  background: #ffaaa5;}#pcm-re {  width: 48px;  height: 8px;  z-index: 120;  left: 264px;  top: 80px;}#pcm-go {  width: 80px;  height: 8px;  z-index: 120;  left: 248px;  top: 80px;}";
		var b = "#pcm-c {  width: 1168px;  border-top: 50px solid black;  padding-bottom: 50px;  height: 272px;  position: relative;  background: black;  outline: 0;  overflow: hidden;  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}#pcm-c * {  position: absolute;  overflow: hidden;}#pcm-p,#pcm-cc {  left: 90px;  width: 992px;  height: 272px;  z-index: 99;  overflow: hidden;}#pcm-p .pcm-d {  width: 4px;  height: 4px;  margin-left: 6px;  margin-top: 6px;  background: #f8b090;  z-index: 100;}#pcm-p .pcm-e {  width: 16px;  height: 16px;  z-index: 101;}#pcm-sc-1 {  left: 36px;  top: 32px;  width: 16px;  height: 112px;  position: absolute;  overflow: hidden;}#pcm-sc-2 {  left: 36px;  top: 160px;  width: 16px;  height: 112px;  position: absolute;  overflow: hidden;}#pcm-le {  position: absolute;  left: 1090px;  top: 148px;  height: 128px;  width: 64px;} #pcm-le div {  position: relative;}#pcm-sc-1-l {    left: -4px;  top: 0;  width: 96px;  height: 16px;}#pcm-sc-2-l {    left: -4px;  top: 128px;  width: 96px;  height: 16px;}#pcm-so {  left: 14px;  top: 232px;  width: 24px;  height: 24px;  border: 16px solid black;  cursor: pointer;}#pcm-li {  position: absolute;  left: 1106px;  top: 0;  height: 160px;  width: 32px;}#pcm-li .pcm-lif {  position: relative;  width: 32px;  height: 24px;  margin-bottom: 6px;}#pcm-p.blk .pcm-e {  visibility: hidden;}#pcm-c .pcm-ac {  width: 32px;  height: 32px;  margin-left: -8px;  margin-top: -8px;  z-index: 110;}#pcm-c .pcm-n {  z-index: 111;}#pcm-c #pcm-stck {  z-index: 109;}#pcm-c #pcm-gbug {  width: 64px;}#pcm-c #pcm-bpcm {  width: 64px;  height: 64px;  margin-left: -40px;  margin-top: -40px;}#pcm-f,#pcm-le div {  width: 64px;  height: 32px;  z-index: 105;}#pcm-f {  margin-left: -16px;  margin-top: -8px;}#pcm-do {  width: 38px;  height: 4px;  left: 558px;  top: 92px;  overflow: hidden;  position: absolute;  background: #ffaaa5;}#pcm-re {  width: 96px;  height: 16px;  z-index: 120;  left: 528px;  top: 160px;}#pcm-go {  width: 160px;  height: 16px;  z-index: 120;  left: 496px;  top: 160px;}";
		g.styleElement = document.createElement("style");
        g.styleElement.type = "text/css";
        if (g.styleElement.styleSheet) g.styleElement.styleSheet.cssText = b;
        else g.styleElement.appendChild(document.createTextNode(b));
        document.getElementsByTagName("head")[0].appendChild(g.styleElement)
    };
    g.createCanvasElement = function () {
        g.canvasEl = document.createElement("div");
        g.canvasEl.id = "pcm-c";
        g.canvasEl.hideFocus = a;
        document.getElementById("logo").appendChild(g.canvasEl);
        g.canvasEl.tabIndex = 0;
        g.canvasEl.focus()
    };
    g.everythingIsReady = function () {
        if (!g.ready) {
            g.ready = a;
			google.pacman.ready = g.ready; //
            var b = document.getElementById("logo-l");
            google.dom.remove(b);
            document.getElementById("logo").style.background = "black";
            g.addCss();
            g.createCanvasElement();
            g.speedIntervals = [];
            g.oppositeDirections = [];
            g.oppositeDirections[1] = 2;
            g.oppositeDirections[2] = 1;
            g.oppositeDirections[4] = 8;
            g.oppositeDirections[8] = 4;
            g.addEventListeners();
            g.fpsChoice = 0;
            g.canDecreaseFps = a;
            g.initializeTickTimer();
            g.newGame()
        }
    };
    g.checkIfEverythingIsReady = function () {
        if (g.soundReady || g.graphicsReady) g.updateLoadingProgress(0.67);
        if (g.soundReady && g.graphicsReady) {
            g.updateLoadingProgress(1);
            g.everythingIsReady()
        }
    };
    g.preloadImage = function (b) {
        var c = new Image,
            d = google.browser.engine.IE;
        if (!d) c.onload = g.imageLoaded;
        c.src = b;
        d && g.imageLoaded()
    };
    g.imageLoaded = function () {
        g.graphicsReady = a;
        g.checkIfEverythingIsReady()
    };
    g.prepareGraphics = function () {
        g.graphicsReady = e;
        g.preloadImage("pacman10-hp-sprite.png")
    };
    g.trimString = function (b) {
        return b.replace(/^[\s\xa0]+|[\s\xa0]+$/g, "")
    };
    g.g = function (b, c) {
        if (b < c) return -1;
        else if (b > c) return 1;
        return 0
    };
    g.compareVersions = function (b, c) {
        for (var d = 0, f = g.trimString(String(b)).split("."), h = g.trimString(String(c)).split("."), j = Math.max(f.length, h.length), k = 0; d == 0 && k < j; k++) {
            var x = f[k] || "",
                F = h[k] || "",
                G = new RegExp("(\\d*)(\\D*)", "g"),
                H = new RegExp("(\\d*)(\\D*)", "g");
            do {
                var t = G.exec(x) || ["", "", ""],
                    u = H.exec(F) || ["", "", ""];
                if (t[0].length == 0 && u[0].length == 0) break;
                d = t[1].length == 0 ? 0 : parseInt(t[1], 10);
                var I = u[1].length == 0 ? 0 : parseInt(u[1], 10);
                d = g.g(d, I) || g.g(t[2].length == 0, u[2].length == 0) || g.g(t[2], u[2])
            } while (d == 0)
        }
        return d
    };
    g.getFlashVersion = function (b) {
        b = b.match(/[\d]+/g);
        b.length = 3;
        return b.join(".")
    };
    g.detectFlash = function () {
        var b = e,
            c = "";
        if (navigator.plugins && navigator.plugins.length) {
            var d = navigator.plugins["Shockwave Flash"];
            if (d) {
                b = a;
                if (d.description) c = g.getFlashVersion(d.description)
            }
            if (navigator.plugins["Shockwave Flash 2.0"]) {
                b = a;
                c = "2.0.0.11"
            }
        } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
            if (b = (d = navigator.mimeTypes["application/x-shockwave-flash"]) && d.enabledPlugin) {
                c = d.enabledPlugin.description;
                c = g.getFlashVersion(c)
            }
        } else try {
            d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
            b = a;
            c = g.getFlashVersion(d.GetVariable("$version"))
        } catch (f) {
            try {
                d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
                b = a;
                c = "6.0.21"
            } catch (h) {
                try {
                    d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                    b = a;
                    c = g.getFlashVersion(d.GetVariable("$version"))
                } catch (j) {}
            }
        }
        g.hasFlash = b;
        g.flashVersion = c;
    };
    g.isFlashVersion = function (b) {
        return g.compareVersions(g.flashVersion, b) >= 0
    };
    g.prepareSound = function () {
        g.soundAvailable = e;
        g.soundReady = e;
		g.sound = {};
		g.soundBuf = [];
		g.snd_a = [ "start-music", "eating-dot-2", "ambient-1", "death-double", "fruit", 
							"eating-dot-1", "death", "ambient-3", "ambient-fright", 
							"ambient-eyes", "ambient-2", "extra-life", "start-music-double", 
							"eating-dot-double", "eating-ghost", "ambient-4", "cutscene" ];
        
		window.AudioContext = window.AudioContext || window.webkitAudioContext;
		g.context = new AudioContext();
							
		for(var si = 0; si < g.snd_a.length; si++){
			g.loadAudio(si);
		}
		
		window.setTimeout(g.soundLoaded, 2E3);
    };
	g.loadAudio = function(b){
		var aAudioData = base64DecToArr( soundArray[g.snd_a[b]] ).buffer;
			g.context.decodeAudioData(
				aAudioData,
				function(buf) {
					if (!buf) {
					  console.error('error decoding sound data ' + b);
					  return;
					}
					//console.debug(b);
					//g.soundBuf.push(buf);
					g.soundBuf[b] = buf;
				},
				function(error) {
					console.error('decodeAudioData error', error);
				}
			)
	};
    g.flashNotReady = function () {
        if (!g.ready) {
            g.soundAvailable = e;
            g.soundReady = a;
            g.checkIfEverythingIsReady()
        }
    };
    g.flashReady = function (b) {
        g.flashSoundPlayer = b;
        g.soundAvailable = a;
        g.soundReady = a;
        g.checkIfEverythingIsReady()
    };
	g.soundLoaded = function() {
		for(var si = 0; si < g.snd_a.length; si++){
			g.sound[g.snd_a[si]] = g.soundBuf[si];
		}

		g.soundAvailable = a;
        g.soundReady = a;
		g.checkIfEverythingIsReady()
        //window.setTimeout(function(){g.checkIfEverythingIsReady()}, 3E3);
	};
	
    g.flashLoaded = function () {
        if (g.flashIframeDoc) {
            var b = g.flashIframeDoc.getElementById("pacman-sound-player");
            if (b && b.playTrack) {
                g.flashReady(b);
                return
            } else if ((b = g.flashIframeDoc.getElementById("pacman-sound-player-2")) && b.playTrack) {
                g.flashReady(b);
                return
            }
        }
        g.flashNotReady()
    };
    g.destroy = function () {
        if (google.pacman) {
            g.stopAllAudio();
            window.clearInterval(g.tickTimer);
            window.clearInterval(g.dotTimer);
            window.clearInterval(g.dotTimerMs);
            google.dom.remove(g.styleElement);
            google.dom.remove(g.flashIframe);
            google.dom.remove(g.canvasEl);
            google.pacman = undefined
        }
    };
    g.exportFunctionCalls = function () {
        google.pacman = {};
        google.pacman.insertCoin = g.insertCoin;
        //google.pacman.flashLoaded = g.flashLoaded;
        google.pacman.destroy = g.destroy;
		google.pacman.keyPressed = g.keyPressed;
		google.pacman.ready = g.ready;
    };
    g.updateLoadingProgress = function (b) {
        b = Math.round(b * 200);
        try{
			document.getElementById("logo-b").style.width = b + "px"
		}catch(a){
		}
    };
    g.init = function () {
        g.ready = e;
		google.pacManSound = a;
        document.getElementById("logo").title = "";
        g.updateLoadingProgress(0.33);
        g.exportFunctionCalls();
        g.useCss = navigator.userAgent.indexOf("MSIE 5.") != -1 || navigator.userAgent.indexOf("MSIE 6.") != -1 || navigator.userAgent.indexOf("MSIE 7.") != -1 ? e : a;
        g.prepareGraphics();
        g.prepareSound()
    };
    g.init();
}();
